import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import java.util.concurrent.Callable;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
@WebServlet(name = "ValiCodeServlet")
public class ValiCodeServlet extends HttpServlet {

    private static final long serialVersionUID= -479885884254942306L;
    public static final char[] CHARS={
            '2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K',
            'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    //生成随机字符,放到RandomString里面
    public static Random random=new Random();
    public static String getRandomString(){
        StringBuffer buffer=new StringBuffer();
        for(int i=0;i<4;i++){
            buffer.append(CHARS[random.nextInt(CHARS.length)]);
        }
        return  buffer.toString();
    }
    //生成随机颜色
    public static Color getRandomColor(){
        return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));
    }
    //生成翻转颜色
    public static Color getReverseColor(Color c){
        return  new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("image/jpeg");
        //获取随机验证码的四个字符
        String randomString=getRandomString();
        //把当前的验证码，放到当前会话中Session
        request.getSession(true).setAttribute("vali",randomString);
        //定义图片大小
        int width=80;
        int height=30;
        Color color=getRandomColor();
        Color reverse=getReverseColor(color);
        //创建一个图片
        BufferedImage bi=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        Graphics2D g=bi.createGraphics();//创建一个画布
        g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));//往里面写字体
        g.setColor(color);//往里面写颜色
        g.fillRect(0,0,width,height);
        g.setColor(reverse);
        g.drawString(randomString,18,20);//把字符画进去
        //生成干扰线
        for(int i=0,n=random.nextInt(100);i<n;i++){
            g.drawRect(random.nextInt(width),random.nextInt(height),1,1);
        }

        //转成JPEG格式
        ServletOutputStream out=response.getOutputStream();
        JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
        encoder.encode(bi);
        out.flush();
    }

    public static void main(String[] args) {
        System.out.println(getRandomString());
    }
}